
/*
 * 础石OS	-- 设备树
 *
 * Copyright (C) 2022 国科础石(重庆)软件有限公司
 *
 * 作者: Jingchen Zhong <zhongjingchen@kernelsoft.com>
 *
 * License terms: GNU General Public License (GPL) version 3
 *
 */

#ifndef __ASM_NATI_DT_H
#define __ASM_NATI_DT_H

#include <dim-sum/types.h>
#include <dim-sum/simple_console.h>

#define CONFIG_NR_MEM_BANK	16
struct device_node;

/**
 *  内存bank初始化，
 *  注意：必须在发布设备树之前调用
 */
int nati_memory_bank_setup(void);

/**
 *  获取物理内存bank数
 *  注意：必须在发布设备树之前调用
 */
u32 get_mem_nr_bank(void);

/**
 *  获取物理内存指定bank的起始地址
 *  注意：必须在发布设备树之前调用
 */
int get_mem_bank_start(u32 bank, phys_addr_t *addr);

/**
 *  获取物理内存指定bank的大小
 *  注意：必须在发布设备树之前调用
 */
int get_mem_bank_size(u32 bank, u64 *size);


/**
 *  获取物理内存保留区的个数
 *  注意：必须在发布设备树之前调用
 */
int get_mem_reserve_count(u32 *count);

/**
 *  获取物理内存保留区的地址
 *  注意：必须在发布设备树之前调用
 */
int get_mem_reserve_addr(u32 index, phys_addr_t *addr);

/**
 *  获取物理内存保留区的大小
 *  注意：必须在发布设备树之前调用
 */
int get_mem_reserve_size(u32 index, u64 *size);

/**
 *  fdt blob 解析填充到root node
 */
int nati_devtree_populate(struct device_node **root);

/**
 * 早期设备树解析接口，获取memory、chosen、cmdline等信息
 */
int early_init_dt_scan(void);

/**
 * 早期simple console匹配
 */
int early_init_dt_match_stdout(void);


/**
 * 设备树虚拟地址
 */
extern virt_addr_t devtree_virt;

/**
 * 设备树第一个Page的虚拟地址
 */
extern virt_addr_t devtree_virt_base;

/**
 * 设备树第一个Page的物理地址
 */
extern phys_addr_t devtree_phys_base;

/**
 * 设备树的结束虚拟地址
 */
extern virt_addr_t devtree_virt_end;

/**
 * 设备树大小
 */
extern unsigned long devtree_virt_size;
#endif /* __ASM_NATI_DT_H */
